//package com.reliable.framework.utils;
//
//import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
//import com.reliable.api.dto.user.XssUserLite;
//import com.reliable.framework.utils.JwtUtils;
//import org.apache.ibatis.executor.statement.StatementHandler;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.plugin.*;
//import org.apache.ibatis.reflection.MetaObject;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import java.sql.Connection;
//import java.util.Properties;
//
///**
// * 数据权限拦截器：自动为 SELECT 语句添加 create_by = 当前用户ID
// * 只有 userType == 1（管理员）才跳过过滤
// */
//@Intercepts({
//        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
//})
//@Component
//public class DataScopeInterceptor implements Interceptor {
//
//    private static final Logger log = LoggerFactory.getLogger(DataScopeInterceptor.class);
//
//    private static final String CREATE_BY_FIELD = "create_by"; // 数据库字段名
//    private static final Long ADMIN_USER_TYPE = 1L; // 管理员类型
//
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
//        MetaObject metaObject = PluginUtils.getMetaObject(statementHandler);
//
//        // 获取原始 SQL
//        BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
//        String originalSql = boundSql.getSql().trim();
//
//        // 只拦截 SELECT 语句
//        if (!originalSql.toUpperCase().startsWith("SELECT")) {
//            return invocation.proceed();
//        }
//
//        // 获取当前登录用户
//        XssUserLite loginUser = JwtUtils.getCurrentUser();
//        if (loginUser == null) {
//            return invocation.proceed(); // 未登录，放行
//        }
//
//        // 如果是管理员，跳过权限过滤
//        if (ADMIN_USER_TYPE.equals(loginUser.getUserType())) {
//            log.debug("管理员 [{}] 跳过数据权限过滤", loginUser.getId());
//            return invocation.proceed();
//        }
//
//        // 普通用户：强制添加 WHERE create_by = ?
//        Long currentUserId = loginUser.getId();
//        if (currentUserId == null) {
//            throw new RuntimeException("无法获取当前用户 ID");
//        }
//
//        // 构造新 SQL：正确处理 WHERE 和 LIMIT
//        String newSql = addDataScopeCondition(originalSql, currentUserId);
//
//        // 使用 MetaObject 修改 SQL
//        metaObject.setValue("delegate.boundSql.sql", newSql);
//
//        log.debug("普通用户 [{}] SQL 已添加权限过滤: {}", currentUserId, newSql);
//
//        return invocation.proceed();
//    }
//
//    /**
//     * 为SQL添加数据权限条件
//     * @param originalSql 原始SQL
//     * @param userId 用户ID
//     * @return 添加了数据权限条件的SQL
//     */
//    private String addDataScopeCondition(String originalSql, Long userId) {
//        String sql = originalSql.toUpperCase();
//
//        // 查找 WHERE 子句的位置
//        int whereIndex = sql.indexOf(" WHERE ");
//        // 查找 LIMIT 子句的位置
//        int limitIndex = sql.indexOf(" LIMIT ");
//
//        String dataScopeCondition = " AND " + CREATE_BY_FIELD + " = " + userId;
//
//        if (whereIndex == -1) {
//            // 没有 WHERE 子句，需要添加
//            if (limitIndex == -1) {
//                // 没有 LIMIT 子句
//                return originalSql + " WHERE " + CREATE_BY_FIELD + " = " + userId;
//            } else {
//                // 有 LIMIT 子句，需要在 LIMIT 前插入 WHERE 条件
//                String beforeLimit = originalSql.substring(0, limitIndex);
//                String afterLimit = originalSql.substring(limitIndex);
//                return beforeLimit + " WHERE " + CREATE_BY_FIELD + " = " + userId + " " + afterLimit;
//            }
//        } else {
//            // 有 WHERE 子句
//            if (limitIndex == -1) {
//                // 没有 LIMIT 子句
//                return originalSql + dataScopeCondition;
//            } else {
//                // 有 LIMIT 子句，需要在 LIMIT 前插入条件
//                String beforeLimit = originalSql.substring(0, limitIndex);
//                String afterLimit = originalSql.substring(limitIndex);
//                return beforeLimit + dataScopeCondition + " " + afterLimit;
//            }
//        }
//    }
//
//
//    @Override
//    public Object plugin(Object target) {
//        if (target instanceof StatementHandler) {
//            return Plugin.wrap(target, this);
//        }
//        return target;
//    }
//
//    @Override
//    public void setProperties(Properties properties) {}
//}
